using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.IO;
using System.Web;
using AEL.ACT;
using AEL.BOD;
using BEL;

namespace DEL.BOD
{
    /// <summary>
    /// Acceso a la base de datos
    /// Modulo:Bodega tar
    /// Tabla:Bod_Transferencia_Despacho
    /// </summary>
    public class DO_Bod_Transferencia_Despacho
    {
        #region Adapter
        private static CEL.BOD.DO_Bod_Transferencia_Despacho _adpBod_Transferencia_Despacho;
        private static CEL.BOD.DO_Bod_Transferencia_Despacho adpBod_Transferencia_Despacho
        {
            get
            {
                if (_adpBod_Transferencia_Despacho == null)
                    _adpBod_Transferencia_Despacho = new CEL.BOD.DO_Bod_Transferencia_Despacho();
                return _adpBod_Transferencia_Despacho;
            }
        }

        private static CEL.BOD.DO_Bod_Transferencia_Despacho_Det _adpBod_Transferencia_Despacho_Det;
        private static CEL.BOD.DO_Bod_Transferencia_Despacho_Det adpBod_Transferencia_Despacho_Det
        {
            get
            {
                if (_adpBod_Transferencia_Despacho_Det == null)
                    _adpBod_Transferencia_Despacho_Det = new CEL.BOD.DO_Bod_Transferencia_Despacho_Det();
                return _adpBod_Transferencia_Despacho_Det;
            }

        }

        private static CEL.BOD.DO_Bod_Transferencia_Det _adpBod_Transferencia_Det;
        private static CEL.BOD.DO_Bod_Transferencia_Det adpBod_Transferencia_Det
        {
            get
            {
                if (_adpBod_Transferencia_Det == null)
                    _adpBod_Transferencia_Det = new CEL.BOD.DO_Bod_Transferencia_Det();
                return _adpBod_Transferencia_Det;
            }

        }

        private static CEL.BOD.DO_Bod_Transferencia_Recepcion _adpBod_Transferencia_Recepcion;
        private static CEL.BOD.DO_Bod_Transferencia_Recepcion adpBod_Transferencia_Recepcion
        {
            get
            {
                if (_adpBod_Transferencia_Recepcion == null)
                    _adpBod_Transferencia_Recepcion = new CEL.BOD.DO_Bod_Transferencia_Recepcion();
                return _adpBod_Transferencia_Recepcion;
            }
        }

        private static CEL.BOD.DO_Bod_Transferencia_Recepcion_Det _adpBod_Transferencia_Recepcion_Det;
        private static CEL.BOD.DO_Bod_Transferencia_Recepcion_Det adpBod_Transferencia_Recepcion_Det
        {
            get
            {
                if (_adpBod_Transferencia_Recepcion_Det == null)
                    _adpBod_Transferencia_Recepcion_Det = new CEL.BOD.DO_Bod_Transferencia_Recepcion_Det();
                return _adpBod_Transferencia_Recepcion_Det;
            }

        }

        private static CEL.BOD.DO_Bod_Orden _adpBod_Orden;
        private static CEL.BOD.DO_Bod_Orden adpBod_Orden
        {
            get
            {
                if (_adpBod_Orden == null)
                    _adpBod_Orden = new CEL.BOD.DO_Bod_Orden();
                return _adpBod_Orden;
            }
        }

        private static CEL.BOD.DO_Bod_Kardex _adpBod_Kardex;
        private static CEL.BOD.DO_Bod_Kardex adpBod_Kardex
        {
            get
            {
                if (_adpBod_Kardex == null)
                    _adpBod_Kardex = new CEL.BOD.DO_Bod_Kardex();
                return _adpBod_Kardex;
            }
        }
        #endregion

        #region Operaciones con datos

        public static string Insert(Scope s, Bod_Transferencia_Despacho oBod_Transferencia_Despacho)
        {
            // Inserto los objetos
            string resultado="";
            try
            {
                adpBod_Transferencia_Despacho.Adapter.BeginTransaction();
                adpBod_Transferencia_Despacho_Det.Adapter.Transaction = adpBod_Transferencia_Despacho.Adapter.Transaction;
                adpBod_Transferencia_Det.Adapter.Transaction = adpBod_Transferencia_Despacho.Adapter.Transaction;

                //Insertar la cabecera del Despacho
                resultado = adpBod_Transferencia_Despacho.Insert(s, oBod_Transferencia_Despacho);

             //Insertar los articulos que todavia faltan por despachar de la transferencia 

                //sacar una lista de las transferencias que faltan por despachar
                List<Bod_Transferencia_Det> list_Bod_Transferencia_Det =
                    adpBod_Transferencia_Det.GetByDespacho(s, oBod_Transferencia_Despacho.Bod_Transferencia_Id);

                //insertar las transferencia que faltan en el detalle del despacho
                foreach (Bod_Transferencia_Det vBod_Transferencia_Det in list_Bod_Transferencia_Det)
                {
                    Bod_Transferencia_Despacho_Det oBod_Transferencia_Despacho_Det = new Bod_Transferencia_Despacho_Det();

                    oBod_Transferencia_Despacho_Det.Bod_Transferencia_Despacho_Id = oBod_Transferencia_Despacho.Id;
                    oBod_Transferencia_Despacho_Det.Bod_Transferencia_Det_Id = vBod_Transferencia_Det.Id;
                    oBod_Transferencia_Despacho_Det.Bod_Unidad_Id = vBod_Transferencia_Det.Bod_Unidad_Id;
                    oBod_Transferencia_Despacho_Det.Cantidad = vBod_Transferencia_Det.Cantidad;

                    adpBod_Transferencia_Despacho_Det.Insert(s, oBod_Transferencia_Despacho_Det);

                }
                adpBod_Transferencia_Despacho.Adapter.CommitTransaction();
            }
            catch (Exception e)
            {
                adpBod_Transferencia_Despacho.Adapter.RollbackTransaction();
                if (e.Message.StartsWith("MSJ"))
                { throw (e); }
                else
                { EmitirExcepcion(TXT_Mensajes._MSJ14, e.Message); }
            }
            return resultado;
        }

       
        public static int Delete(Scope s, Bod_Transferencia_Despacho oBod_Transferencia_Despacho)
        {
            int resultado = 0;
            try
            {
                adpBod_Transferencia_Despacho.Adapter.BeginTransaction();
                adpBod_Transferencia_Despacho_Det.Adapter.Transaction = adpBod_Transferencia_Despacho.Adapter.Transaction;
                adpBod_Transferencia_Det.Adapter.Transaction = adpBod_Transferencia_Despacho.Adapter.Transaction;

                List<Bod_Transferencia_Despacho_Det> list_Bod_Transferencia_Despacho_Det =
                        adpBod_Transferencia_Despacho_Det.GetByDespacho(s, oBod_Transferencia_Despacho.Id);

                foreach (Bod_Transferencia_Despacho_Det vBod_Transferencia_Despacho_Det in list_Bod_Transferencia_Despacho_Det)
                {
                    adpBod_Transferencia_Despacho_Det.Delete(s, vBod_Transferencia_Despacho_Det);
                }

                // Borrar la cabecera del despacho
                resultado = adpBod_Transferencia_Despacho.Delete(s, oBod_Transferencia_Despacho);

                adpBod_Transferencia_Despacho.Adapter.CommitTransaction();
            }
            catch (Exception e)
            {
                adpBod_Transferencia_Despacho.Adapter.RollbackTransaction();
                if (e.Message.StartsWith("MSJ"))
                { throw (e); }
                else
                { EmitirExcepcion(TXT_Mensajes._MSJ14, e.Message); }
            }
            return resultado;
        }

        public static void EmitirExcepcion(string mensaje, string caso)
        {
            Exception eCaso = new System.Exception(caso);
            Exception otroEX = new System.Exception(mensaje, eCaso);
            throw otroEX;
        }

        public static void Insert_Orden(Scope s, ref Bod_Transferencia_Despacho p_Objeto)
        {
            try
            {
                adpBod_Transferencia_Despacho_Det.Adapter.BeginTransaction();
                adpBod_Orden.Adapter.Transaction = adpBod_Transferencia_Despacho_Det.Adapter.Transaction;

                List<Bod_Transferencia_Despacho_Det> lstBodTransferenciaDespachoDet = adpBod_Transferencia_Despacho_Det.GetByDespacho(s, p_Objeto.Id);
                Bod_Orden bodOrden = null;
                foreach (Bod_Transferencia_Despacho_Det bodTransferenciaDespachoDet in lstBodTransferenciaDespachoDet)
                {
                    bodOrden = new Bod_Orden();
                    bodOrden.Origen = "DES";
                    bodOrden.Tipo = "EGR";
                    bodOrden.Origen_Id = p_Objeto.Id;
                    bodOrden.Fecha_Creacion = DateTime.Now;
                    bodOrden.Creacion_Per_Personal_Id = s.Per_Personal_Id;
                    bodOrden.Fecha_Update = DateTime.Now;
                    bodOrden.Update_Per_Personal_Id = s.Per_Personal_Id;
                    bodOrden.Bod_Bodega_Id = p_Objeto.Bod_Bodega_Id;
                    bodOrden.Com_Articulo_Id = bodTransferenciaDespachoDet.Com_Articulo_Id;
                    bodOrden.Cantidad = bodTransferenciaDespachoDet.Cantidad;
                    bodOrden.Bod_Unidad_Id = bodTransferenciaDespachoDet.Referencia_Bod_Unidad_Id;
                    bodOrden.Origen_Det_Id = bodTransferenciaDespachoDet.Id;
                    bodOrden.Bod_Kardex_Id = null;
                    bodOrden.XML = bodTransferenciaDespachoDet.Cantidad + bodTransferenciaDespachoDet.Bod_Unidad_Nombre;
                    bodOrden.Fecha = p_Objeto.Fecha;
                    
                        adpBod_Orden.Insert(s, bodOrden);
                        Bod_Transferencia_Despacho_Det bodTransferenciaDespachoDetNuevo = new Bod_Transferencia_Despacho_Det(bodTransferenciaDespachoDet);
                        bodTransferenciaDespachoDetNuevo.Bod_Orden_Id = bodOrden.Id;
                        adpBod_Transferencia_Despacho_Det.Update(s, bodTransferenciaDespachoDetNuevo, bodTransferenciaDespachoDet);
                    
                }
                 Bod_Transferencia_Recepcion_Det oBod_Transferencia_Recepcion_Det = null;

                //Insertar en la Cabecera de la recepcion
                Bod_Transferencia_Recepcion oBod_Transferencia_Recepcion = new Bod_Transferencia_Recepcion();

                oBod_Transferencia_Recepcion.Bod_Transferencia_Id = p_Objeto.Bod_Transferencia_Id;
                oBod_Transferencia_Recepcion.Bod_Transferencia_Despacho_Id = p_Objeto.Id;
                oBod_Transferencia_Recepcion.Bod_Bodega_Id = p_Objeto.Bod_Bodega_Id;
                oBod_Transferencia_Recepcion.Fecha = DateTime.Now;
                oBod_Transferencia_Recepcion.Creacion_Per_Personal_Id = p_Objeto.Creacion_Per_Personal_Id;
                oBod_Transferencia_Recepcion.Fecha_Creacion = DateTime.Now;
                oBod_Transferencia_Recepcion.Update_Per_Personal_Id = p_Objeto.Update_Per_Personal_Id;
                oBod_Transferencia_Recepcion.Fecha_Update = DateTime.Now;

                adpBod_Transferencia_Recepcion.Insert(s, oBod_Transferencia_Recepcion);

                //Insertar el detalle de la recepcion

                //insertar las transferencia que faltan en el detalle del despacho
                foreach (Bod_Transferencia_Despacho_Det vBod_Transferencia_Despacho_Det in lstBodTransferenciaDespachoDet)
                {
                    oBod_Transferencia_Recepcion_Det = new Bod_Transferencia_Recepcion_Det();

                    oBod_Transferencia_Recepcion_Det.Bod_Transferencia_Recepcion_Id = oBod_Transferencia_Recepcion.Id;
                    oBod_Transferencia_Recepcion_Det.Bod_Transferencia_Det_Id = vBod_Transferencia_Despacho_Det.Bod_Transferencia_Det_Id;
                    oBod_Transferencia_Recepcion_Det.Bod_Unidad_Id = vBod_Transferencia_Despacho_Det.Bod_Unidad_Id;
                    oBod_Transferencia_Recepcion_Det.Cantidad = vBod_Transferencia_Despacho_Det.Cantidad;
                    oBod_Transferencia_Recepcion_Det.Bod_Orden_Id = null;

                    adpBod_Transferencia_Recepcion_Det.Insert(s, oBod_Transferencia_Recepcion_Det);
                }              
                adpBod_Transferencia_Despacho_Det.Adapter.CommitTransaction();
            }
            catch (Exception e)
            {
                adpBod_Transferencia_Despacho_Det.Adapter.RollbackTransaction();
                if (e.Message.StartsWith("MSJ"))
                { throw (e); }
                else
                { EmitirExcepcion(TXT_Mensajes._MSJ14, e.Message); }
            }
        }

        public static void Insert_Kardex(Scope s, ref Bod_Transferencia_Despacho p_Objeto)
        {
            try
            {
                adpBod_Orden.Adapter.BeginTransaction();

                List<Bod_Orden> lstBodOrden = adpBod_Orden.GetByOrigenOrigenId(s, "DES", p_Objeto.Id);
                Bod_Kardex bodKardex = null;
                foreach (Bod_Orden bodOrden in lstBodOrden)
                {
                    bodKardex = new Bod_Kardex();
                    bodKardex.Int_Empresa_Id = s.Int_Empresa_Id;
                    bodKardex.Bod_Bodega_Id = bodOrden.Bod_Bodega_Id;                  
                    bodKardex.Marca = "ABI";
                    bodKardex.Tipo = "EGR";
                    bodKardex.Fecha_Creacion = DateTime.Now;
                    bodKardex.Creacion_Per_Personal_Id = s.Per_Personal_Id;
                    bodKardex.Fecha_Update = DateTime.Now;
                    bodKardex.Update_Per_Personal_Id = s.Per_Personal_Id;
                    bodKardex.Com_Articulo_Id = bodOrden.Com_Articulo_Id;
                    bodKardex.Cantidad = bodOrden.Referencia_Cantidad;
                    bodKardex.Xml = bodOrden.Fecha_Creacion.ToString();
                    bodKardex.Fecha = p_Objeto.Fecha;
                    
                        DEL.BOD.DO_Bod_Kardex.Insert(s, ref bodKardex);
                        Bod_Orden nuevoObjeto = new Bod_Orden(bodOrden);
                        nuevoObjeto.Bod_Kardex_Id = bodKardex.Id;
                        adpBod_Orden.Update(s, nuevoObjeto, bodOrden);
                    
                }
                adpBod_Orden.Adapter.CommitTransaction();
            }
            catch (Exception e)
            {
                adpBod_Orden.Adapter.RollbackTransaction();
                if (e.Message.StartsWith("MSJ"))
                { throw (e); }
                else
                { EmitirExcepcion(TXT_Mensajes._MSJ14, e.Message); }
            }
        }

        public static void Delete_Kardex(Scope s, ref Bod_Transferencia_Despacho p_Objeto)
        {
            try
            {                
                List<Bod_Orden> lstBodOrden = adpBod_Orden.GetByOrigenOrigenId(s, "DES", p_Objeto.Id);
                foreach (Bod_Orden bodOrden in lstBodOrden)
                {
                    Bod_Orden nuevoObjeto = new Bod_Orden(bodOrden);
                    nuevoObjeto.Bod_Kardex_Id = null;
                    adpBod_Orden.Update(s, nuevoObjeto, bodOrden);

                    List<Bod_Kardex> lstbodKardex = adpBod_Kardex.GetById(s, bodOrden.Bod_Kardex_Id);
                    foreach (Bod_Kardex Bodkardex in lstbodKardex)
                    {
                        DEL.BOD.DO_Bod_Kardex.Delete(s, Bodkardex);
                    } 
                    
                }
            }
            catch (Exception e)
            {
                if (e.Message.StartsWith("MSJ"))
                { throw (e); }
                else
                { EmitirExcepcion(TXT_Mensajes._MSJ14, e.Message); }
            }
        }


        public static void Delete_Orden(Scope s, ref Bod_Transferencia_Despacho p_Objeto)
        {
            try
            {              
                List<Bod_Orden> lstBodOrden = adpBod_Orden.GetByOrigenOrigenId(s, "DES", p_Objeto.Id);
                foreach (Bod_Orden bodOrden in lstBodOrden)
                {
                    List<Bod_Transferencia_Despacho_Det> lstBodTransferenciaDespachoDet = adpBod_Transferencia_Despacho_Det.GetByDespacho(s, p_Objeto.Id);
                    foreach (Bod_Transferencia_Despacho_Det bodTransferenciaDespachoDet in lstBodTransferenciaDespachoDet)
                    {
                        Bod_Transferencia_Despacho_Det bodTransferenciaDespachoDetNuevo = new Bod_Transferencia_Despacho_Det(bodTransferenciaDespachoDet);
                        bodTransferenciaDespachoDetNuevo.Bod_Orden_Id = null;
                        adpBod_Transferencia_Despacho_Det.Update(s, bodTransferenciaDespachoDetNuevo, bodTransferenciaDespachoDet);
                    }
                    adpBod_Orden.Delete(s, bodOrden);
                }                
            }
            catch (Exception e)
            {
                if (e.Message.StartsWith("MSJ"))
                { throw (e); }
                else
                { EmitirExcepcion(TXT_Mensajes._MSJ14, e.Message); }
            }
        }


        #endregion
    }
}
